package com.atguigu.day18.generic03.g2;

import org.junit.Test;

/*
泛型: 参数化类型(参考形参)
  泛型的好处: 规定输入数据类型
            避免强制转换
  泛型的位置:
        类: 泛型类   HashSet<E>
        接口: 泛型接口 interface Collection<E>
        -----
        方法: 返回值前有泛型声明的方法
          public static <T> void show(T t){}
          public <T> void eat(T t){}
       注意:
         1.泛型中的字母 任意 K T E V
           K key  V value  T type  E element

  泛型的上限: T extends 类型:
            T extends Number:  未知数据 既可以是Number 也可以是Numb的孩子
            指定多个上限 T extends 类型1 & 类型2
  泛型的擦除:
          1.泛型存在于编译时
          2.如果需要泛型没有指定泛型则使用最高类型Object
  泛型的通配符: ? 给泛型赋值  代表: 任意类型

       通配符的上限: ? extends 类型
                   未知类型最高是指定类型 也可以是指定类型的孩子
                   ? extends Comparable
                   未知类型最高是Comparable 也可以是Comparable的孩子

       通配符的下限: ? super 类型
                   未知类型 最低是指定类型 也可以是指定类型的父亲
                   ? super Dog
                   未知类型最低是Dog 也可以是Dog的父亲

 */
class Z implements Comparable{
    @Override
    public int compareTo(Object o) {
        return 0;
    }
}
public class GenericTest {
    /**
     * 获取成绩最高的学生
     * @param arr
     * @return
     */
    public Student  getMaxScore(Student<? extends Comparable>[] arr){

        return null;
    }

    @Test
    public void test02(){
        Student<Integer>[] arr1 = new Student[4];
        Student<Double> arr2[] = new Student[4];
        Student<Z>[] arr3= new Student[4];

        getMaxScore(arr1);
        getMaxScore(arr2);
        getMaxScore(arr3);

    }



    @Test
    public void test01() {
        Student<Integer> s1 = new Student<>("张三", 100);
        Student<Double> s2 = new Student<>("李四", 99.5);
        Student<Character> s3 = new Student<>("王五", 'A');
        Student<Object> s4 = new Student<>("张三", new Object());


        Student<Integer>[] arr1 = new Student[4];
        arr1[0] = s1;
        //arr1[1]=s2;

        Student<Object> arr2[] = new Student[4];
        arr2[0] = s4;
        // arr2[1]=s1;


        Student<?>[] arr3 = new Student[4];
        arr3[0] = s1;
        arr3[1] = s2;
        arr3[2] = s3;
        arr3[3] = s4;


    }

}
